﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TISModel;
using BTO;
using DAL;
using Exceptions;


namespace BLL
{
    public class BLLCategoria
    {
        public List<BTO.Categoria> list()
        {
            DALCategoria categorias = new DALCategoria();
            List<BTO.Categoria> btoCategoria = categorias.list();
            
            if (btoCategoria.Count() == 0 )
            {
                throw new NotFoundCategoriaException("Nao existem categorias registadas.");
            }
            return btoCategoria;
        }

        public BTO.Categoria getByID(int id)
        {
            DALCategoria dalCategoria = new DALCategoria();
            BTO.Categoria btoCategoria = dalCategoria.getByID(id);

            if (btoCategoria == null)
            {
                throw new NotFoundCategoriaException("Categoria nao encontrada!");
            }

            return btoCategoria;
        }

        public BTO.Categoria getByDescricao(String descricao)
        {
            DALCategoria dalCategoria = new DALCategoria();
            BTO.Categoria btoCategoria = dalCategoria.getByDescricao(descricao);

            if (btoCategoria == null)
            {
                throw new NotFoundCategoriaException("Categoria com esta descrição não encontrada!");
            }

            return btoCategoria;
        }

        public void insert(BTO.Categoria toInsert)
        {
            DALCategoria dalCategoria = new DALCategoria();
            BTO.Categoria btoCategoria;

            btoCategoria = dalCategoria.getByDescricao(toInsert.descricao);

            if (btoCategoria != null)
            {
                throw new DescricaoCategoriaException("Já existe uma categoria com a descricao indicada!");
            }

            try
            {
                dalCategoria.insert(toInsert);
            }
            catch (Exception e) {
                throw new InsertCategoriaException(e.Message);
            }
        }

        public void update(BTO.Categoria toUpdate)
        {
            DALCategoria dalCategoria = new DALCategoria();
            BTO.Categoria btoCategoria;

            btoCategoria = dalCategoria.getByDescricao(toUpdate.descricao);

            if (btoCategoria != null && btoCategoria.IDCategoria != toUpdate.IDCategoria)
            {
                throw new DescricaoCategoriaException("Já existe uma categoria com a descricao indicada!");
            }

            try
            {
                dalCategoria.update(toUpdate);
            }
            catch (Exception e) {
                throw new UpdateCategoriaException(e.Message);
            }
        }

        public void delete(int id)
        {
            DALCategoria dalCategoria = new DALCategoria();
            DALAlojamento dalAlojamento = new DALAlojamento();

            List<BTO.Alojamento> listAlojamento = dalAlojamento.getByCategoria(id);
            if (listAlojamento.Count() > 0)
            {
                throw new AlojamentosAssociadosCategoriaException("Existem Alojamentos associados à esta Categoria!");
            }

            try {
                dalCategoria.delete(id);
            }
            catch (Exception e) {
                throw new DeleteCategoriaException(e.Message);
            }
        }
    }
}
